package com.cskaoyan.javase.array._2initialization;

/**
 * 数组的初始化
 * 声明完毕数组后,若想使用数组,必须初始化数组
 * 类比于变量的初始化,是给变量开辟内存空间,然后赋值
 * 数组的初始化也是一样,需要开辟数组空间,然后对数组元素赋值
 * 这就意味着:
 *      1.数组的长度必须是明确的
 *      2.数组中的元素的取值也必须是明确的
 * 以上两点都明确,JVM才能够帮助我们开辟数组空间,初始化数组.
 *
 * 数组的初始化语法:
 * 格式一,静态初始化,指的是直接告诉数组中元素的个数,以及具体取值.
 * 数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
 * 静态初始化有简写的形式,可以直接写完:
 *      数据类型[] 数组名 = {元素1,元素2,元素3...};
 *      注意:数组的静态初始化简写形式必须和数组的声明写在一起,不能用简写形式给数组变量赋值.
 *
 * 格式二,动态初始化,指的是直接告诉数组的长度,其余不告诉
 * 数据类型[] 数组名 = new 数据类型[数组的长度];
 * 注: 数组的长度是一个正整数或0,并且取值范围在int以内.
 * 思考: 数组的动态初始化只告诉了数组长度,没有说明元素取值,那么这种初始化方式,元素没有取值吗?
 *      显然不可能,既然初始化能够成功,元素必然是有取值的.但是这个取值,程序员没有给出,是JVM在创建数组时给出的,这个值称之为默认值,这个给出数组元素默认值的过程称之为默认初始化(赋值).
 *
 * 以上就是数组的两种初始化方式,(一维)数组没有第三种初始化方式.比如典型的"动静结合"
 * 数组的初始化两种方式,在开发使用中,可以根据实际情况选择其一去使用.
 *
 * 数组的特点和缺点
 * 数组的优点: 随机存取,随机访问 快,效率高
 * 数组的缺点: 必须占用连续的内存空间,必须要求元素的数据类型一致
 *              以上缺点表现在代码上 ---> 意味着数组对内存空间要求很严格,创建数组,必须规划好数组空间
 *              ---> 所以数组的内存空间一旦确定,数组的初始化一旦完成,那么这片区域除非被销毁,否者数组的长度是不可更改的
 *              这是数组非常大的一个缺点
 *              这意味着在使用数组时,必须严格考量数组的长度
 *              长了不行,浪费空间
 *              短了更不行,装不下
 *              所以数组是很难用的,数组在实际开发中直接使用的机会也不多.
 *
 * 在实际的开发中,有这样一种数组,它能够随机访问,还能够自动扩容,这就是集合中的ArrayList
 * ArrayList的底层就是数组,它有下标可以随机访问,但是不受数组长度的限制,可以自动扩容.(自动扩容是通过将元素复制到一个更长的数组实现对的)
 *
 * 上面我们一直在说开辟数组内存空间,这里开辟的是JVM的内存空间,所以作为Java程序需要对JVM内存空间(尤其是运行时内存空间)
 * 有一定的了解.
 *
 *
 * @since 10:03
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 静态初始化一个长度为0的int数组,里面不能存放任何元素
        int[] arr = new int[]{};
        // 静态初始化一个长度为3的double数组
        double[] arr2 = new double[]{0.1, 0.2, 0.3};
        // 静态初始化简写形式
        String[] arr3 = {"hello", "abc", "666"};

        // 数组的静态初始化简写形式必须和数组的声明写在一起
        // arr = {1, 3, 4};

        // 动态初始化一个长度为3的int数组
        int[] arr4 = new int[3];

        // 典型的"动静结合"错误
        // int[] arr5 = new int[3]{1,2,3};
    }
}
